package gov.nist.registry.ws;
import static org.junit.Assert.assertTrue;
import gov.nist.registry.common2.registry.MetadataSupport;
import java.io.IOException;
import java.util.Iterator;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.util.ByteArrayDataSource;
import javax.xml.stream.XMLStreamException;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.OMText;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.junit.Test;
import org.openhealthtools.common.utils.OMUtil;
/**
*
* @author arnouten
*/
public class ProvideAndRegisterDocumentSetTest {
/**
* The 'document' node of a p&r might contain a whitespace node before the actual document data. This occurred, for example,
* in a provide by ISC at the 2010 European Connectathon. This did not result in an error, but in an empty document to be
* 'successfully' submitted.
*
* The p&r handler was modified to ignore whitespace nodes. This unittest tests this.
*
* @throws IOException
* @throws XMLStreamException
*/
@Test
public void testWhitespaceBeforeDocument() throws IOException, XMLStreamException
{
String message = IOUtils.toString(ProvideAndRegisterDocumentSetTest.class.getResourceAsStream("/data/submit_document.xml"));
String documentString = IOUtils.toString(ProvideAndRegisterDocumentSetTest.class.getResourceAsStream("/data/referral_summary.xml"));
//replace document and submission set uniqueId variables with actual uniqueIds.
message = message.replace("$XDSDocumentEntry.uniqueId", "2.16.840.1.113883.3.65.2." + System.currentTimeMillis());
message = message.replace("$XDSSubmissionSet.uniqueId", "1.3.6.1.4.1.21367.2009.1.2.108." + System.currentTimeMillis());
//message = message.replace("$patientId", patientId);
//replace the document uuid.
//String uuid = getUUID();
//message = message.replace("$doc1", uuid);
for (Boolean includeWhitespace : new Boolean[] { false, true })
{
OMElement request = OMUtil.xmlStringToOM(message);
request = addOneDocument(request, documentString, "doc1", includeWhitespace);
for (OMElement document : MetadataSupport.childrenWithLocalName(request, "Document")) {
OMText text = ProvideAndRegisterDocumentSet.getBinaryNode(document);
assertTrue("Blank document. Included whitespace: " + includeWhitespace, StringUtils.isNotBlank(text.getText()));
}
}
}
protected OMElement addOneDocument(OMElement request, String document, String documentId, boolean includeWhitespace) throws IOException {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace ns = fac.createOMNamespace("urn:ihe:iti:xds-b:2007" , null);
OMElement docElem = fac.createOMElement("Document", ns);
docElem.addAttribute("id", documentId, null);
// A string, turn it into an StreamSource
DataSource ds = new ByteArrayDataSource(document, "text/xml");
DataHandler handler = new DataHandler(ds);
OMText binaryData = fac.createOMText(handler, true);
if (includeWhitespace)
{
/** The whitespace */
docElem.addChild(fac.createOMText("\n"));
}
docElem.addChild(binaryData);
Iterator iter = request.getChildrenWithLocalName("SubmitObjectsRequest");
OMElement submitObjectsRequest = null;
for (;iter.hasNext();) {
submitObjectsRequest = (OMElement)iter.next();
if (submitObjectsRequest != null)
break;
}
submitObjectsRequest.insertSiblingAfter(docElem);
return request;
}
}